/// 可以使用Rust标准库中的HashSet达到目的，这里没有使用标准库，手动实现计数。
pub fn new_count_distinct(input_str: &str) -> usize {
    let arr = input_str_to_arr(input_str);
    count(&arr)
}

// ---------------------------------------------------------------------------------
// 把以逗号分隔的`input_str`字符串转化成正排序数组，例如："a,b,c" => ["a", "b", "c"]
// 因为要转换成等效的数组，所以我们要保证`input_str`格式的正确性，要考虑：
// 1、过滤`input_str`的prefix和suffix的空白字符，例如："   a,b,c     " => ["a", "b", "c"]
// 2、过滤`input_str`的prefix和suffix的逗号字符，例如：",a,b," => ["a", "b"]
fn input_str_to_arr(input_str: &str) -> Vec<&str> {
    let input_str = input_str.trim().trim_matches(&[',']);

    // 如果过滤后的字符串为空的话，返回一个空的Vec
    if input_str.is_empty() {
        return Vec::new();
    }

    let mut arr: Vec<&str> = input_str.split(",").collect();
    arr.sort(); // 正排序(我们喜欢有规则的世界),rust内置的排序算法性能挺好
    arr
}

// 计算字符串数组中不重复字符串的个数
fn count(arr: &[&str]) -> usize {
    // 如果数组的长度为0，直接返回0
    if arr.len() == 0 {
        return 0;
    }

    let mut temp = arr[0]; // 先把数组的第一个字符串当做参照比较
    let mut count = 1; // 设不重复的个数为1

    // 遍历字符串数组，如果`s != temp`的话，那么就更新`temp`这个参照比较，同时`count`计数增加1
    // 如果比较的字符串很长的话，推荐先做成哈希值，然后进行比较
    for &s in arr {
        if s == temp {
            continue;
        } else {
            count += 1;
            temp = s;
        }
    }
    count
}
// ---------------------------------------------------------------------------------
